package com.android.support.lib.universal.qr.landscape;

import java.io.IOException;
import java.util.Vector;

import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.Handler;
import android.os.Vibrator;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.TextView;

import com.android.support.lib.universal.R;
import com.android.support.lib.universal.qr.landscape.code.CameraManager;
import com.android.support.lib.universal.qr.landscape.code.CaptureActivityHandler;
import com.android.support.lib.universal.qr.landscape.code.InactivityTimer;
import com.android.support.lib.universal.util.Utilview;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;

/**
 * 二维码扫描
 * 
 * @author 彭治铭 使用说明： 一：权限 <uses-permission
 *         android:name="android.permission.INTERNET" /> <uses-permission
 *         android:name="android.permission.CAMERA" />
 * 
 *         <uses-feature android:name="android.hardware.camera" /> <uses-feature
 *         android:name="android.hardware.camera.autofocus" /> <uses-permission
 *         android:name="android.permission.VIBRATE" /> <uses-permission
 *         android:name="android.permission.FLASHLIGHT" /> <uses-permission
 *         android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
 *         <uses-permission
 *         android:name="android.permission.ACCESS_NETWORK_STATE" />
 * 
 *         二：跳转 Intent it = new Intent(MainActivity.this,
 *         CaptureActivity.class);
 *         it.putExtra("class",this.getClass());//记录当前跳转的 Activity
 *         startActivityForResult(it, 1); //参数二 为requestCode
 * 
 *         三：结果返回
 * @Override protected void onActivityResult(int requestCode, int resultCode,
 *           Intent data) { // TODO Auto-generated method stub switch
 *           (requestCode) { case 1: if (data != null)// 成功返回 { String result =
 *           data.getStringExtra("result"); if (result != null) { //
 *           result为扫描返回结果 } }
 * 
 *           break;
 * 
 *           default: break; }
 * 
 *           super.onActivityResult(requestCode, resultCode, data); }
 * 
 *
 */
public class CaptureActivity extends Activity implements Callback,
		OnClickListener {

	private CaptureActivityHandler handler;
	private ViewfinderView viewfinderView;
	private boolean hasSurface;
	private Vector<BarcodeFormat> decodeFormats;
	private String characterSet;
	private TextView txtResult;
	private InactivityTimer inactivityTimer;
	private MediaPlayer mediaPlayer;
	private boolean playBeep;
	private static final float BEEP_VOLUME = 0.10f;
	private boolean vibrate;

	private Class<Activity> Class;// 记录返回的Activity

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 防止View跑到状态栏上去去。布局添加以下两个属性
		// android:fitsSystemWindows="true"
		// android:clipToPadding="true"
		// 手机版本要求在4.4及以上版本
		if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
			// 透明状态栏,屏幕的顶部
			getWindow().addFlags(
					WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
			// 透明导航栏，屏幕的底部
			// getWindow().addFlags(
			// WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
		}
		if (this.getIntent() != null && this.getIntent().getExtras() != null
				&& this.getIntent().getExtras().get("class") != null) {
			Class = (java.lang.Class<Activity>) this.getIntent().getExtras()
					.get("class");
		}

		setContentView(R.layout.lib_activity_landscape_capture);
		// 初始化 CameraManager
		CameraManager.init(getApplication());

		viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
		txtResult = (TextView) findViewById(R.id.txtResult);
		hasSurface = false;
		// 使当前Activity定时销毁
		inactivityTimer = new InactivityTimer(this);
	}

	@SuppressWarnings("deprecation")
	@Override
	protected void onResume() {
		super.onResume();
		SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
		SurfaceHolder surfaceHolder = surfaceView.getHolder();
		if (hasSurface) {
			initCamera(surfaceHolder);
		} else {
			surfaceHolder.addCallback(this);
			surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		}
		decodeFormats = null;
		characterSet = null;

		playBeep = true;
		AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
		if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
			playBeep = false;
		}
		initBeepSound();
		vibrate = true;
	}

	@Override
	protected void onPause() {
		super.onPause();
		if (handler != null) {
			handler.quitSynchronously();
			handler = null;
		}
		CameraManager.get().closeDriver();
	}

	@Override
	protected void onDestroy() {
		inactivityTimer.shutdown();
		super.onDestroy();
	}

	// 初始化相机
	private void initCamera(SurfaceHolder surfaceHolder) {
		try {
			CameraManager.get().openDriver(surfaceHolder);
		} catch (Exception ioe) {
			Utilview.showToastView("相机权限获取失败");
			this.finish();
		}
		if (handler == null) {
			handler = new CaptureActivityHandler(CaptureActivity.this,
					decodeFormats, characterSet);
		}
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		if (!hasSurface) {
			hasSurface = true;
			initCamera(holder);
		}

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		hasSurface = false;

	}

	public ViewfinderView getViewfinderView() {
		return viewfinderView;
	}

	public Handler getHandler() {
		return handler;
	}

	public void drawViewfinder() {
		viewfinderView.drawViewfinder();

	}

	/**
	 * 扫描完成
	 * 
	 * @param obj
	 *            ,obj.getText()扫描文本
	 * @param barcode
	 *            ,扫描位图（二维码截图）
	 */
	public void handleDecode(Result obj, Bitmap barcode) {
		inactivityTimer.onActivity();

		// viewfinderView.drawResultBitmap(barcode);
		// playBeepSoundAndVibrate();
		// txtResult.setText(obj.getText());
		//Log.e("test","返回结果"+obj.getText());
		// 返回结果
		if (Class != null) {
			String str = obj.getText();
			Intent it = new Intent(CaptureActivity.this, Class);
			it.putExtra("class", this.getClass());
			it.putExtra("result", str);
			setResult(1, it);
			finish();
		}

	}

	/**
	 * 初始化声音
	 */
	private void initBeepSound() {
		if (playBeep && mediaPlayer == null) {
			// The volume on STREAM_SYSTEM is not adjustable, and users found it
			// too loud,
			// so we now play on the music stream.
			setVolumeControlStream(AudioManager.STREAM_MUSIC);
			mediaPlayer = new MediaPlayer();
			mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
			mediaPlayer.setOnCompletionListener(beepListener);

			AssetFileDescriptor file = getResources().openRawResourceFd(
					R.raw.lib_qr_beep);
			try {
				mediaPlayer.setDataSource(file.getFileDescriptor(),
						file.getStartOffset(), file.getLength());
				file.close();
				mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
				mediaPlayer.prepare();
			} catch (IOException e) {
				mediaPlayer = null;
			}
		}
	}

	private static final long VIBRATE_DURATION = 200L;

	/**
	 * 播放声音
	 */
	private void playBeepSoundAndVibrate() {
		if (playBeep && mediaPlayer != null) {
			mediaPlayer.start();
		}
		if (vibrate) {
			Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
			vibrator.vibrate(VIBRATE_DURATION);

		}
	}

	/**
	 * When the beep has finished playing, rewind to queue up another one.
	 */
	private final OnCompletionListener beepListener = new OnCompletionListener() {
		public void onCompletion(MediaPlayer mediaPlayer) {
			mediaPlayer.seekTo(0);
		}
	};

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (v.getId() == R.id.rela_return || v.getId() == R.id.btn_return) {// 返回
			this.finish();
		}
	}

}
